home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtappl.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  18.2 KB  |  637 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtAppl;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*
  29.  *  3.01     | 02.02.92 |  Hp  | Proc. ApplName aufgenommen. Bei Appl-  *
  30.  *           |          |      | path wird jetzt der Filename gel”scht  *
  31.  *-----------+----------+------+----------------------------------------*
  32.  *  3.02     | 10.02.92 |  Hp  | Variable DeskX und DeskY aufgenommen.  *
  33.  *           |          |      | Sie enthalten den Ursprung des Desktop *
  34.  *           |          |      | Damit sparen sich die Klientmodule den *
  35.  *           |          |      | Aufruf von Windget um die Fenstergr”že *
  36.  *           |          |      | zu ermitteln.                          *
  37.  *-----------+----------+------+----------------------------------------*
  38.  *  3.03     | 18.03.92 |  Hp  | Die Ermittlung der Bitplanes erfolgt   *
  39.  *           |          |      | jetzt mittels vq_extnd. Der Grund ist, *
  40.  *           |          |      | daž es neuerdings eine TrueColor-Karte *
  41.  *           |          |      | gibt, bei der das AES Probleme bekommt *
  42.  *           |          |      | Ich bin allerdings der Meinung, das es *
  43.  *           |          |      | Aufgabe des Treibers w„re, diesen Wert *
  44.  *           |          |      | korrekt an das AES zu bermitteln...   *
  45.  *-----------+----------+------+----------------------------------------*)
  46.  
  47.  
  48.  
  49. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  50. (*                                              *)
  51. (*$R-   Range-Checks                            *)
  52. (*$S-   Stack-Check                             *)
  53. (*                                              *)
  54. (*----------------------------------------------*)
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  64.  
  65.  
  66.  
  67.  
  68. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  69.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  70.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  71.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  72.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  73.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  74.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  75.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. FROM SYSTEM IMPORT  ADDRESS, ADR, BYTE, TSIZE;
  83. FROM MagicStrings IMPORT  Append, Assign, Length, Equal, Insert;
  84. IMPORT  MagicTypes, MagicAES, MagicVDI, MagicDOS, MagicBIOS, MagicSys;
  85.  
  86.  
  87. (*----------------------------------------------------------------------*)
  88.  
  89. CONST   ABCGEM =        0210H;
  90.  
  91. CONST   cFonts =        0; 
  92.         cPhysical =     1;
  93.        (* cOpen Wird nicht mehr ben”tigt, da der Pointer nun beim Schliessen
  94.         * der Workstation gel”scht wird.
  95.         *)
  96.  
  97. CONST   NDC =           0;
  98.         RC =            2;
  99.  
  100. CONST   MaxMaus =       64; (* Verschachtelungstiefe von Store/RestoreMouse *)
  101.  
  102. TYPE    WsPtr =         POINTER TO WsInfo;
  103.         WsInfo =        RECORD
  104.                          handle:  sINTEGER;
  105.                          flags:   sBITSET;
  106.                          addr:    ADDRESS; (* Dummyfeld *)
  107.                          next:    WsPtr;
  108.                          last:    WsPtr;
  109.                         END;
  110.  
  111. TYPE    TermPtr =       POINTER TO TermInfo;
  112.         TermInfo =      RECORD
  113.                          proc:  PROC;
  114.                          next:  TermPtr;
  115.                         END;
  116.  
  117.  
  118. VAR     WorkInArray:    MagicVDI.tWorkIn;
  119.         WorkOutArray:   MagicVDI.tWorkOut;
  120.         applpath:       ARRAY [0..255] OF CHAR;
  121.         applname:       ARRAY [0..20] OF CHAR;
  122.  
  123. VAR     WorkStation:    WsPtr;
  124.         TermProc:       TermPtr;
  125.  
  126. VAR     ProgReturn:     sINTEGER;
  127.         stack:          ADDRESS;
  128.         BasePage:       MagicTypes.PtrPD;
  129.         GEMversion:     sINTEGER;
  130.         gdos:           lCARDINAL;
  131.         GrafHandle:     sINTEGER;
  132.         init:           sCARDINAL;
  133.  
  134. TYPE    tMerker =       RECORD
  135.                          sicht: BOOLEAN;
  136.                          form:  sINTEGER;
  137.                          user:  ADDRESS;
  138.                         END;
  139.  
  140. VAR     Maus:           ARRAY [0..MaxMaus] OF tMerker;
  141.         Merker:         sCARDINAL;
  142.  
  143.  
  144.  
  145. PROCEDURE ApplInit;
  146. VAR i: sINTEGER;
  147.     b: BOOLEAN;
  148.     l: lCARDINAL;
  149.     f: sINTEGER;
  150.     cw, ch, bw, bh : sINTEGER;
  151.     s: ARRAY [0..3] OF sINTEGER;
  152.     attr: ARRAY [0..9] OF sINTEGER;
  153.     p: WsPtr;
  154.     name: ARRAY [0..7] OF CHAR;
  155. BEGIN
  156.  IF init # 30961 THEN
  157.  
  158.   (* Applikation anmelden *)
  159.   ApplIdent:= MagicAES.ApplInit ();
  160.   IF ApplIdent < 0 THEN  HALT; END;
  161.  
  162.   KaosTos:= (MagicAES.AESIntIn[0] = 04B41H) AND (MagicAES.AESIntIn[1] = 04F53H);
  163.  
  164.   GEMversion:= MagicAES.AESGlobal.apVersion;
  165.  
  166.   IF GEMversion # ABCGEM THEN  gdos:= MagicSys.VqGdos();
  167.                          ELSE  gdos:= ABCGEM;
  168.   END;
  169.  
  170.   (* Test auf ApplGetinfo *)
  171.   name := "?AGI"+0c;
  172.   MagicAES.hasAgi := (GEMversion >= $400) OR (MagicAES.ApplFind (ADR(name)) = 0);
  173.  
  174.   (* Handle der physikalischen Workstation ermitteln *)
  175.   MagicAES.GrafHandle (GrafHandle, CharWidth, CharHeight, BoxWidth, BoxHeight);
  176.  
  177.   (* Private Workstation ”ffnen *)
  178.   PrivateWS:= OpenWorkstation(Screen, 0, 0, TRUE);
  179.   (* Basiseinstellungen fr PrivateWS vornehmen *)  
  180.   MagicVDI.SetTextalignment (PrivateWS, 0, 5, i, i);
  181.   i:= MagicVDI.SetFillcolor (PrivateWS, 0); (* Fllfarbe weiž *)
  182.   b:= MagicVDI.SetFillperimeter (PrivateWS, FALSE); (* Kein Rand *)
  183.  
  184.   IF (gdos # MagicVDI.NoGdos)
  185.   THEN
  186.     p:= Intern (PrivateWS);
  187.     i := MagicVDI.LoadFonts (PrivateWS, 0);
  188.     INCL (p^.flags, cFonts);
  189.   END;
  190.  
  191.   (* Den Font des AES ermitteln *)
  192.   MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  193.  
  194.   b := FALSE;  
  195.   IF MagicAES.hasAgi
  196.   THEN
  197.     i := MagicAES.ApplGetinfo (0, AESFontsize, AESFontid, i, i);
  198.     b := i = 1; (* Boolean auf success setzen *)
  199.   END;
  200.   IF ~MagicAES.hasAgi OR ~b
  201.   THEN
  202.     MagicVDI.InqText (GrafHandle, attr); (* Aktuelle Parameter holen *)
  203.     AESFontid := attr[0];
  204.  
  205.     
  206.     (* Font setzen und Ergebnis prfen *)
  207.     (*
  208.     IF (MagicVDI.SetTextface (PrivateWS, AESFontid) # AESFontid)
  209.        & (gdos # MagicVDI.NoGdos)
  210.     THEN
  211.       p:= Intern (PrivateWS);
  212.       i := MagicVDI.LoadFonts (PrivateWS, 0);
  213.       INCL (p^.flags, cFonts);
  214.     END;
  215.     *)
  216.     (* Jetzt Font setzen *)
  217.     i := MagicVDI.SetTextface (PrivateWS, AESFontid);
  218.   
  219.     (* Und jetzt die Gr”že herausknobeln *)
  220.     f:= 0;
  221.     REPEAT
  222.      INC (f);
  223.      MagicVDI.SetCharheight (PrivateWS, f, cw, ch, bw, bh);
  224.     UNTIL (bw = CharWidth) AND (bh = CharHeight); (* !!! *)
  225.   
  226.     AESFontsize:= f;
  227.  
  228.  
  229.   END;
  230.  
  231.   MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  232.  
  233.   (* Jetzt Font setzen *)
  234.   i := MagicVDI.SetTextface (PrivateWS, AESFontid);
  235.   MagicVDI.SetCharheight (PrivateWS, AESFontsize, i,i,i,i);
  236.  
  237.   (* Allgemeine Workstation ”ffnen *)
  238.   VDIHandle:= OpenWorkstation(Screen, 0, 0, TRUE);
  239.  
  240.   (* Gesamtbreite und H”he des Bildschirms *)
  241.   MaxWidth:= WorkOutArray[0] + 1;
  242.   MaxHeight:= WorkOutArray[1] + 1;
  243.   MaxColors:= WorkOutArray[13];
  244.  
  245.   MagicAES.WindGet (0, 7, s);  DeskX:= s[0];  DeskY:= s[1];
  246.  
  247.   (* Bitplanes:= MagicAES.AESGlobal.apNplanes; *)
  248.   MagicVDI.ExtendedInq (VDIHandle, MagicVDI.Extended, WorkOutArray);
  249.   Bitplanes:= WorkOutArray[4];
  250.  
  251.   (* MausStack initialisieren *)
  252.   Merker:= 0;
  253.   Maus[Merker].sicht:= TRUE;
  254.   Maus[Merker].form:= MagicAES.ARROW;
  255.   Maus[Merker].user:= Null;
  256.   MagicAES.GrafMouse (MagicAES.ARROW, Null);
  257.  
  258.  END;
  259. END ApplInit;
  260.  
  261. PROCEDURE InstallTermproc (proc: PROC);
  262. VAR p: TermPtr;
  263.  
  264.  PROCEDURE new (): TermPtr;
  265.  VAR q: TermPtr;
  266.  BEGIN
  267.   ALLOCATE (q, TSIZE(TermInfo));  
  268.   IF q = NIL THEN  HALT;  END;
  269.   q^.proc:= proc;
  270.   q^.next:= NIL;
  271.   RETURN q;
  272.  END new;
  273.  
  274. BEGIN
  275.  (*
  276.  IF TermProc = NIL THEN
  277.   TermProc:= new ();
  278.  ELSE
  279.  *)
  280.   p:= TermProc;
  281.   TermProc := new ();
  282.   TermProc^.next := p;
  283.   (*
  284.   WHILE p^.next # NIL DO  p:= p^.next;  END;
  285.   p^.next:= new ();
  286.  END;
  287.   *)
  288. END InstallTermproc;
  289.  
  290. PROCEDURE ApplDeinstall;
  291.   VAR p: TermPtr;
  292. BEGIN
  293.   (* Installierte TermProcedures abarbeiten *)
  294.   p:= TermProc;
  295.   WHILE (p # NIL) DO  p^.proc;  p:= p^.next;  END;
  296. END ApplDeinstall;
  297.  
  298. PROCEDURE ApplTerm (return: sINTEGER);
  299. VAR  p: TermPtr;
  300.      q: WsPtr;
  301.      i: sINTEGER;
  302. BEGIN
  303.  (* Installierte TermProcedures abarbeiten *)
  304.  p:= TermProc;
  305.  WHILE (p # NIL) DO  p^.proc;  p:= p^.next;  END;
  306.  q:= WorkStation;
  307.  WHILE (q # NIL) DO
  308.   IF cFonts IN q^.flags THEN  MagicVDI.UnloadFonts (q^.handle, 0);  END;
  309.   IF cPhysical IN q^.flags THEN MagicVDI.CloseWorkstation (q^.handle);
  310.                            ELSE MagicVDI.CloseVirtual (q^.handle);
  311.   END;
  312.   q:= q^.next;
  313.  END; (* WHILE *)
  314.  MouseOn;
  315.  MagicAES.ApplExit;
  316.  (* MagicSys.Terminate (return); *)
  317. END ApplTerm;
  318.  
  319. PROCEDURE ApplPath (VAR pfad: ARRAY OF CHAR);
  320. BEGIN
  321.  Assign (applpath, pfad);
  322. END ApplPath;
  323.  
  324. PROCEDURE ApplName (VAR name: ARRAY OF CHAR);
  325. BEGIN
  326.  Assign (applname, name);
  327. END ApplName;
  328.  
  329. PROCEDURE OpenWS (kind, x, y, rc: sINTEGER): sINTEGER;
  330. VAR array: POINTER TO ARRAY [0..255] OF sINTEGER;
  331.     h, i: sINTEGER;
  332.     flag: sBITSET;
  333.     p:    WsPtr;
  334.  
  335.  PROCEDURE new (handle: sINTEGER; flags: BITSET): WsPtr;
  336.  VAR q: WsPtr;  i: INTEGER;
  337.  BEGIN
  338.   ALLOCATE (q, TSIZE (WsInfo));  
  339.   IF q = NIL THEN  HALT;  END;
  340.   q^.handle:= handle;  q^.flags:= flags;  q^.addr:= NIL;
  341.   q^.next:= NIL;  q^.last:= NIL;
  342.   RETURN q;
  343.  END new;
  344.  
  345. BEGIN
  346.  WorkInArray[ 1]:= 1;    (* Linientyp, durchgehender Strich *)
  347.  WorkInArray[ 2]:= 1;    (* Liniefarbe, schwarz             *)
  348.  WorkInArray[ 3]:= 1;    (* Markertyp, Punkt                *)
  349.  WorkInArray[ 4]:= 1;    (* Markerfarbe, schwarz            *)
  350.  WorkInArray[ 5]:= AESFontid;    (* Textfont, Systemzeichensatz     *)
  351.  WorkInArray[ 6]:= 1;    (* Textfarbe, schwarz              *)
  352.  WorkInArray[ 7]:= 1;    (* Flltyp, voll                   *)
  353.  WorkInArray[ 8]:= 1;    (* Musterindex,                    *)
  354.  WorkInArray[ 9]:= 1;    (* Musterfarbe, schwarz            *)
  355.  WorkInArray[10]:= rc;   (* Koordinatensystem               *)
  356.  IF kind < 11 THEN
  357.   (* Virtuelle Workstation ”ffnen *)
  358.   WorkInArray[ 0]:= 1; (* Art der Workstation *)
  359.   h:= GrafHandle;
  360.   MagicVDI.OpenVirtual (WorkInArray, h, WorkOutArray);
  361.   IF h < 0 THEN  RETURN -1;  END;
  362.   flag:= {};
  363.  ELSE
  364.   (* Physikalische Workstation ”ffnen *)
  365.   WorkInArray[ 0]:= kind; (* Art der Workstation *)
  366.   IF (kind < 31) AND ((x # 0) OR (y # 0)) THEN
  367.    MagicVDI.VDIPtsIn[0]:= x;
  368.    MagicVDI.VDIPtsIn[1]:= y;
  369.   END;
  370.   MagicVDI.OpenWorkstation (WorkInArray, h, WorkOutArray);
  371.   IF h <= 0 THEN  RETURN -1;  END;
  372.   flag:= {cPhysical};
  373.  END;
  374.  IF WorkStation = NIL THEN
  375.   WorkStation:= new (h, flag);
  376.  ELSE
  377.   p:= WorkStation;
  378.   WHILE p^.next # NIL DO  p:= p^.next;  END;
  379.   p^.next:= new (h, flag);  p^.next^.last:= p;
  380.  END;
  381.  RETURN h;
  382. END OpenWS;
  383.  
  384. PROCEDURE OpenWorkstation (device: Device; w, h: sINTEGER; rc: BOOLEAN): sINTEGER;
  385. VAR try, max, ws, coord: sINTEGER;
  386. BEGIN
  387.  IF rc THEN  coord:= RC;  ELSE  coord:= NDC;  END;
  388.  CASE device OF
  389.   Screen:   try:= 1;   max:= 1; (* Mehr als aktuelle Aufl”sung is nicht *)|
  390.   Plotter:  try:= 11;  max:= 20;|
  391.   Printer:  try:= 21;  max:= 30;|
  392.   Metafile: try:= 31;  max:= 40;|
  393.   Camera:   try:= 41;  max:= 50;|
  394.   Tablett:  try:= 51;  max:= 60;|
  395.   ELSE      ;
  396.  END;
  397.  LOOP
  398.   IF try > max THEN  RETURN -1;  END;
  399.   ws:= OpenWS (try, w, h, coord);
  400.   IF ws > 0 THEN  RETURN ws;  END;
  401.   INC (try);
  402.  END;
  403. END OpenWorkstation;
  404.  
  405. PROCEDURE Intern (handle: sINTEGER): ADDRESS;
  406. VAR p: WsPtr;
  407. BEGIN
  408.  IF handle = -1 THEN  RETURN WorkStation;  END;
  409.  p:= WorkStation;
  410.  WHILE p # NIL DO
  411.   IF p^.handle = handle THEN  RETURN p;  END;
  412.   p:= p^.next;
  413.  END;
  414.  RETURN NIL;
  415. END Intern;
  416.  
  417. PROCEDURE CloseWorkstation (handle: sINTEGER);
  418. VAR p: WsPtr;
  419. BEGIN
  420.  p:= Intern (handle);
  421.  IF p # NIL THEN
  422.   IF cFonts IN p^.flags THEN  MagicVDI.UnloadFonts (p^.handle, 0);  END;
  423.   IF cPhysical IN p^.flags THEN MagicVDI.CloseWorkstation (p^.handle);
  424.                            ELSE MagicVDI.CloseVirtual (p^.handle);
  425.   END;
  426.   IF p^.last # NIL
  427.   THEN
  428.     p^.last^.next:= p^.next;
  429.   END;
  430.   IF p^.next # NIL
  431.   THEN
  432.     p^.next^.last := p^.last;
  433.   END;
  434.   DEALLOCATE (p, 0);
  435.  END; (* IF *)
  436. END CloseWorkstation;
  437.  
  438. (*----------------------------------------------------------------------*
  439.  *                            M„usetreiberei                            *
  440.  *----------------------------------------------------------------------*)
  441.  
  442. PROCEDURE MausEin (mausform: sINTEGER);
  443. BEGIN
  444.  WITH Maus[Merker] DO
  445.   IF NOT sicht THEN
  446.    sicht:= TRUE;  MagicAES.GrafMouse (MagicAES.MON, Null);
  447.   END;
  448.   IF form # mausform THEN
  449.    form:= mausform;
  450.    IF form = MagicAES.USERDEF THEN MagicAES.GrafMouse (form, user);
  451.                               ELSE MagicAES.GrafMouse (form, Null);
  452.    END;
  453.   END;
  454.  END;
  455. END MausEin;
  456.  
  457. PROCEDURE MouseOn;
  458. BEGIN
  459.  MausEin (Maus[Merker].form);
  460. END MouseOn;
  461.  
  462. PROCEDURE MouseArrow;
  463. BEGIN
  464.  MausEin (MagicAES.ARROW);
  465. END MouseArrow;
  466.  
  467. PROCEDURE MouseCursor;
  468. BEGIN
  469.  MausEin (MagicAES.TEXTCRSR);
  470. END MouseCursor;
  471.  
  472. PROCEDURE MouseBusy;
  473. BEGIN
  474.  MausEin (MagicAES.BUSYBEE);
  475. END MouseBusy;
  476.  
  477. PROCEDURE MouseFinger;
  478. BEGIN
  479.  MausEin (MagicAES.POINTHAND);
  480. END MouseFinger;
  481.  
  482. PROCEDURE MouseHand;
  483. BEGIN
  484.  MausEin (MagicAES.FLATHAND);
  485. END MouseHand;
  486.  
  487. PROCEDURE MouseThincross;
  488. BEGIN
  489.  MausEin (MagicAES.THINCROSS);
  490. END MouseThincross;
  491.  
  492. PROCEDURE MouseThickcross;
  493. BEGIN
  494.  MausEin (MagicAES.THICKCROSS);
  495. END MouseThickcross;
  496.  
  497. PROCEDURE MouseOutline;
  498. BEGIN
  499.  MausEin (MagicAES.OUTLCROSS);
  500. END MouseOutline;
  501.  
  502. PROCEDURE MouseUser;
  503. BEGIN
  504.  Maus[Merker].form:= -1;  MausEin (MagicAES.USERDEF);
  505. END MouseUser;
  506.  
  507. PROCEDURE MouseOff;
  508. BEGIN
  509.  WITH Maus[Merker] DO
  510.   IF sicht THEN
  511.    sicht:= FALSE;  MagicAES.GrafMouse (MagicAES.MOFF, Null);
  512.   END;
  513.  END;
  514. END MouseOff;
  515.  
  516. PROCEDURE MouseState (VAR form: sINTEGER; VAR sichtbar: BOOLEAN);
  517. BEGIN
  518.  form:= Maus[Merker].form;
  519.  sichtbar:= Maus[Merker].sicht;
  520. END MouseState;
  521.  
  522. PROCEDURE StoreMouse;
  523. BEGIN
  524.  IF Merker < MaxMaus THEN
  525.   INC (Merker);
  526.   Maus[Merker].sicht:= Maus[Merker-1].sicht;
  527.   Maus[Merker].form:=  Maus[Merker-1].form;
  528.   Maus[Merker].user:=  Maus[Merker-1].user;
  529.  END;
  530. END StoreMouse;
  531.  
  532. PROCEDURE RestoreMouse;
  533. VAR view: BOOLEAN;
  534. BEGIN
  535.  IF Merker > 0 THEN
  536.   view:= Maus[Merker].sicht;
  537.   DEC (Merker);
  538.   WITH Maus[Merker] DO
  539.    IF view AND NOT sicht THEN
  540.     MagicAES.GrafMouse (MagicAES.MOFF, Null);
  541.    ELSIF NOT view AND sicht THEN
  542.     MagicAES.GrafMouse (MagicAES.MON, Null);
  543.    END;
  544.    IF form = MagicAES.USERDEF THEN  MagicAES.GrafMouse (form, user);
  545.                               ELSE  MagicAES.GrafMouse (form, Null);
  546.    END;
  547.   END;
  548.  END;
  549. END RestoreMouse;
  550.  
  551. PROCEDURE UserMouse (VAR form: ARRAY OF LOC);
  552. BEGIN
  553.  Maus[Merker].user:= ADR (form);
  554. END UserMouse;
  555.  
  556. PROCEDURE SetMouse (x, y: sCARDINAL);
  557. VAR xx, yy: sINTEGER;
  558.     ch:     CHAR;
  559.     s:      sBITSET;
  560. BEGIN
  561.  MouseOff;
  562.  s:= MagicVDI.InputLocatorSM (PrivateWS, x, y, xx, yy, ch);
  563.  MouseOn;
  564. END SetMouse;
  565.  
  566. PROCEDURE VqGdos (): lCARDINAL;
  567. BEGIN 
  568.  RETURN gdos;
  569. END VqGdos;
  570.  
  571. PROCEDURE InitMtAppl;
  572. VAR p: ARRAY [0..255] OF CHAR;
  573.     (*$Reg*)  c, d: sCARDINAL;
  574. BEGIN
  575.  IF init # 30961 THEN
  576.  
  577.  
  578.   WorkStation:= NIL;  TermProc:= NIL;
  579.   ApplInit;  (* Applikation und Workstations initialisieren *)
  580.  
  581.   MagicAES.ShelRead (applpath, p);
  582.   c:= Length (applpath); 
  583.   WHILE (c > 0) & (applpath [c - 1] # '\') DO
  584.    DEC (c);
  585.   END; (* WHILE *)
  586.   IF c = 0
  587.   THEN
  588.     (* Kein Pfad drin, nur Name der Applikation! *)
  589.     Assign (applpath, applname);
  590.     (* Applikation mittels shel_find suchen *)
  591.     MagicAES.ShelFind (applpath);
  592.     (* So, und jetzt noch nach letztem Slash suchen und da abschneiden *)
  593.     c:= Length (applpath);  
  594.     WHILE (c > 0) & (applpath [c - 1] # '\') DO
  595.        DEC (c); applpath[c] := 0c;
  596.      END; (* WHILE *)
  597.   ELSE
  598.     (* Ist ein Pfad drin, jetzt trennen *)
  599.     FOR d := c TO Length (applpath) DO
  600.       applname [d-c] := applpath[d];
  601.     END;
  602.     applpath[c] := 0c;
  603.   END;
  604.  
  605.   IF Length (applpath) = 0
  606.   THEN
  607.     MagicDOS.Dgetpath (applpath, MagicDOS.Dgetdrv()+1);
  608.     IF applpath[1] # ':'
  609.     THEN
  610.       d := MagicDOS.Dgetdrv();
  611.       IF applpath[0] # '\'
  612.       THEN
  613.         Insert ('A:\', applpath, 0); 
  614.       ELSE
  615.         Insert ('A:', applpath, 0); 
  616.       END;
  617.       applpath[0] := CHR(ORD('A') + d);
  618.     END;
  619.   END;
  620.  
  621.   c := Length (applpath);
  622.   IF (c > 0 ) & (applpath[c-1] # '\') THEN
  623.     applpath[c] := '\';
  624.     applpath[c+1] := 0c;
  625.   END;
  626.  
  627.   init:= 30961;
  628.  END;
  629. END InitMtAppl;
  630.  
  631.  
  632.  
  633. BEGIN
  634.  init:= 0;
  635.  InitMtAppl;
  636. END mtAppl.
  637.